package moc.gc;


import moc.compiler.MOCException;
import moc.tds.*;
import moc.type.DTYPE;
import moc.type.SIGNATURE;

/**
 * Cette interface décrit une machine cible. A compléter, selon votre modèle
 * 
 * @author marcel
 * 
 */
public interface IMachine {
	/**
	 * Suffixe du fichier cible (.tam par exemple)
	 * 
	 * @return
	 */
	String getSuffixe();
	String genConstructeur(CLASSE c,String code) ;
	/**
	 * Ecrit le code dans un fichier à partir du nom du fichier source et du
	 * suffixe
	 * 
	 * @param fileName
	 * @param code
	 * @throws MOCException
	 */

	void writeCode(String fileName, String code) throws MOCException;
	/**
	 * retourne l'instruction assembleur correspondnte à Operation
	 * exemple : pour la machine TAM, operation plus correxpond à IADD ...
	 * @param operation
	 * @return instruction assembleur 
	 * 
	 */
	String getOperation(String operation) ;
	
	String genOperation(String operation) ;
	
	String genReturn(DTYPE type,int taille) ;
	
	String genConstante(String cste) ;
	
	String genCast(DESCRIPTEUR c, String code) ;
	
	String genChargementVariable(INFOVAR info) ;
	
	String genChargmentMemoire(int taille) ;
	String genEnregistrementMemoire(int taille) ;
	
	String genAppelFonction(int numero,String id) ;
	
	String genFonction (String id,String code) ;
	
	String genCond(String cond,String code1,String code2) ;
	
	String genAlloc(int taille)  ;
	
	String genPOP(int taille) ;
	String genWhile(String cond,String code) ;
	
	
	
	Register getRegister() ;
	String genEnregistrementVariable(INFOVAR info) ;
	 String genChargementAdresse(INFOVAR info) ;
	String genPrelude(String main) ; 
	 String genComment(String txt) ;
	 //Fonctions de logging pour afficher des informations lors de la compilation
	void debug(TDS tds)  ;
	void debug(String pre, String chaine) ;
	void debug(SIGNATURE sig)  ;
	void debug(TDS tds, int num)  ;
	 String genDescripteur(DESCRIPTEUR desc) ;
	 String genAppelMethode(String fcode,INFOMETHODE m ) ;
	 String genAdresse(Emplacement emp ) ;

	String genAppelStatique(CLASSE emp, INFOMETHODE met);
}